package com.towker.core.page;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;



/**
 * 分页信息
 * 第一页从1开始
 * @author badqiu
 */
public class PageModel<T> implements Serializable
{
	protected List<T> result;
	protected int pageSize;
	protected int pageNumber;
	protected int totalCount = 0;
	private String pageName = "page";
	private String pageSizeName = "pageSize";
	private PageRequest pageRequest = null;

	public PageModel(PageRequest p)
	{
		this(p, 0);
		pageRequest = p;
	}

	public PageModel(PageRequest p, int totalCount)
	{
		this(p.getCurrentPage(), p.getPageSize(), totalCount);
		pageRequest = p;
	}

	public PageModel(int pageNumber, int pageSize, int totalCount)
	{
		this(pageNumber, pageSize, totalCount, new ArrayList(0));
	}

	public PageModel(int pageNumber, int pageSize, int totalCount, List<T> result)
	{
		if (pageSize <= 0)
			throw new IllegalArgumentException("[pageSize] must great than zero");
		this.pageSize = pageSize;
		this.pageNumber = PageUtils.computePageNumber(pageNumber, pageSize, totalCount);
		this.totalCount = totalCount;
		setResult(result);
	}

	public void setResult(List<T> elements)
	{
		if (elements == null)
			throw new IllegalArgumentException("'result' must be not null");
		this.result = elements;
	}

	public String getPageName()
	{
		if (pageRequest == null)
			return this.pageName;
		else
			return pageRequest.getPageName();
	}

	public String getPageSizeName()
	{
		if (pageRequest == null)
			return this.pageSizeName;
		else
			return pageRequest.getPageSizeName();
	}

	/**
	 * 当前页包含的数据
	 * @return 当前页数据源
	 */
	public List<T> getResult()
	{
		return result;
	}

	/**
	 * 是否是首页（第一页），第一页页码为1
	 * @return 首页标识
	 */
	public boolean isFirstPage()
	{
		return getCurrentPage() == 1;
	}

	/**
	 * 是否是最后一页
	 * @return 末页标识
	 */
	public boolean isLastPage()
	{
		return getCurrentPage() >= getLastPage();
	}

	/**
	 * 是否有下一页
	 * @return 下一页标识
	 */
	public boolean isHasNextPage()
	{
		return getLastPage() > getCurrentPage();
	}

	/**
	 * 是否有上一页
	 * @return 上一页标识
	 */
	public boolean isHasPreviousPage()
	{
		return getCurrentPage() > 1;
	}

	/**
	 * 获取最后一页页码，也就是总页数
	 * @return 最后一页页码
	 */
	public int getLastPage()
	{
		return PageUtils.computeLastPageNumber(totalCount, pageSize);
	}

	/**
	 * 总的数据条目数量，0表示没有数据
	 * @return 总数量
	 */
	public int getTotalCount()
	{
		return totalCount;
	}

	public void setTotalCount(int count)
	{
		this.totalCount = count;
	}

	/**
	 * 取得总的页数
	 * @return
	 */
	public int getTotalPage()
	{
		int page = this.totalCount / this.pageSize;
		int tmp = this.totalCount % this.pageSize;
		return page + ((tmp == 0) ? 0 : 1);
	}

	/**
	 * 获取当前页的首条数据的行编码
	 * @return 当前页的首条数据的行编码
	 */
	public int getThisPageFirstElementNumber()
	{
		return (getCurrentPage() - 1) * getPageSize() + 1;
	}

	/**
	 * 获取当前页的末条数据的行编码
	 * @return 当前页的末条数据的行编码
	 */
	public int getThisPageLastElementNumber()
	{
		int fullPage = getThisPageFirstElementNumber() + getPageSize() - 1;
		return getTotalCount() < fullPage ? getTotalCount() : fullPage;
	}

	/**
	 * 获取下一页编码
	 * @return 下一页编码
	 */
	public int getNextPage()
	{
		return getCurrentPage() + 1;
	}

	/**
	 * 获取上一页编码
	 * @return 上一页编码
	 */
	public int getPreviousPage()
	{
		return getCurrentPage() - 1;
	}

	/**
	 * 每一页显示的条目数
	 * @return 每一页显示的条目数
	 */
	public int getPageSize()
	{
		return pageSize;
	}

	/**
	 * 当前页的页码
	 * @return 当前页的页码
	 */
	public int getCurrentPage()
	{
		return pageNumber;
	}

	/**
	 * 得到用于多页跳转的页码
	 * @return
	 */
	public List<Integer> getLinkPageNumbers()
	{
		return PageUtils.generateLinkPageNumbers(getCurrentPage(), getLastPage(), 10);
	}

	/**
	 * 得到数据库的第一条记录号
	 * @return
	 */
	public int getFirstResult()
	{
		return PageUtils.getFirstResult(pageNumber, pageSize);
	}
}
